from sqlalchemy import create_engine
# from sqlalchemy.ext.asyncio import create_async_engine  # 异步引擎
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from app.setting.setting import config


# echo=True表示引擎将用repr()函数记录所有语句及其参数列表到日志
engine = create_engine(config.SQLALCHEMY_DATABASE_URI, echo=True, future=True)
# 异步引擎，用于异步操作
# async_engine = create_async_engine(config.SQLALCHEMY_DATABASE_URI, echo=True, future=True)

# SQLAlchemy中，CRUD是通过会话进行管理的，所以需要先创建会话，
# 每一个SessionLocal实例就是一个数据库session
# flush指发送到数据库语句到数据库，但数据库不一定执行写入磁盘
# commit是指提交事务，将变更保存到数据库文件中
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, future=True)

# 创建基本映射类
Base = declarative_base()

# 集成基本映射类，增加dict方法，用于将query返回结果（tuple类型）转换成dict类型
class DBase(Base):
    __abstract__ = True   # DBase不映射成table

    def dict(self):
        return dict(zip(self.__dict__.keys(), self.__dict__.values()))